Specify the tissue of interest, run the boilerplate code which sets up the functions and environment, load the tissue object.

tissue_of_interest = "Tongue"
library(here)
here() starts at /Users/Jintonic/Documents/GitHub/tabula-muris
source(here("00_data_ingest", "02_tissue_analysis_rmd", "boilerplate.R"))

Attaching package: ‘dplyr’

The following object is masked from ‘package:Biobase’:

    combine

The following objects are masked from ‘package:BiocGenerics’:

    combine, intersect, setdiff, union

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
tiss = load_tissue_droplet(tissue_of_interest)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
[1] "Scaling data matrix"

  |                                                                                                          
  |                                                                                                    |   0%
  |                                                                                                          
  |====                                                                                                |   4%
  |                                                                                                          
  |========                                                                                            |   8%
  |                                                                                                          
  |============                                                                                        |  12%
  |                                                                                                          
  |=================                                                                                   |  17%
  |                                                                                                          
  |=====================                                                                               |  21%
  |                                                                                                          
  |=========================                                                                           |  25%
  |                                                                                                          
  |=============================                                                                       |  29%
  |                                                                                                          
  |=================================                                                                   |  33%
  |                                                                                                          
  |======================================                                                              |  38%
  |                                                                                                          
  |==========================================                                                          |  42%
  |                                                                                                          
  |==============================================                                                      |  46%
  |                                                                                                          
  |==================================================                                                  |  50%
  |                                                                                                          
  |======================================================                                              |  54%
  |                                                                                                          
  |==========================================================                                          |  58%
  |                                                                                                          
  |==============================================================                                      |  62%
  |                                                                                                          
  |===================================================================                                 |  67%
  |                                                                                                          
  |=======================================================================                             |  71%
  |                                                                                                          
  |===========================================================================                         |  75%
  |                                                                                                          
  |===============================================================================                     |  79%
  |                                                                                                          
  |===================================================================================                 |  83%
  |                                                                                                          
  |========================================================================================            |  88%
  |                                                                                                          
  |============================================================================================        |  92%
  |                                                                                                          
  |================================================================================================    |  96%
  |                                                                                                          
  |====================================================================================================| 100%
Calculating gene means
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variance to mean ratios
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

Later on (in FindClusters and TSNE) you will pick a number of principal components to use. This has the effect of keeping the major directions of variation in the data and, ideally, supressing noise. There is no correct answer to the number to use, but a decent rule of thumb is to go until the plot plateaus.

PCElbowPlot(object = tiss)

Choose the number of principal components to use.

# Set number of principal components. 
n.pcs = 14

The clustering is performed based on a nearest neighbors graph. Cells that have similar expression will be joined together. The Louvain algorithm looks for groups of cells with high modularity–more connections within the group than between groups. The resolution parameter determines the scale…higher resolution will give more clusters, lower resolution will give fewer.

For the top-level clustering, aim to under-cluster instead of over-cluster. It will be easy to subset groups and further analyze them below.

# Set resolution 
res.used <- 0.4
tiss <- FindClusters(object = tiss, reduction.type = "pca", dims.use = 1:n.pcs, 
    resolution = res.used, print.output = 0, save.SNN = TRUE, force.recalc = TRUE)

To visualize

# If cells are too spread out, you can raise the perplexity. If you have few cells, try a lower perplexity (but never less than 10).
tiss <- RunTSNE(object = tiss, dims.use = 1:n.pcs, seed.use = 20, perplexity=35, dim.embed = 2)
TSNEPlot(object = tiss, do.label = T, pt.size = 1.2, label.size = 4)

Check expression of genes of interset.

Dotplots let you see the intensity of exppression and the fraction of cells expressing for each of your genes of interest.

How big are the clusters?

table(tiss@ident)

   0    1    2    3    4    5    6    7    8    9   10 
1389 1095 1079  869  815  602  601  485  366  199   38 
tiss1=BuildClusterTree(tiss)
[1] "Finished averaging RNA for cluster 0"
[1] "Finished averaging RNA for cluster 1"
[1] "Finished averaging RNA for cluster 2"
[1] "Finished averaging RNA for cluster 3"
[1] "Finished averaging RNA for cluster 4"
[1] "Finished averaging RNA for cluster 5"
[1] "Finished averaging RNA for cluster 6"
[1] "Finished averaging RNA for cluster 7"
[1] "Finished averaging RNA for cluster 8"
[1] "Finished averaging RNA for cluster 9"
[1] "Finished averaging RNA for cluster 10"

#cluster1.markers <- FindMarkers(object = tiss, ident.1 = 1, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster2.markers <- FindMarkers(object = tiss, ident.1 = 2, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster3.markers <- FindMarkers(object = tiss, ident.1 = 3, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster4.markers <- FindMarkers(object = tiss, ident.1 = 4, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster5.markers <- FindMarkers(object = tiss, ident.1 = 5, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
cluster6.markers <- FindMarkers(object = tiss, ident.1 = 6, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster7.markers <- FindMarkers(object = tiss, ident.1 = 7, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster8.markers <- FindMarkers(object = tiss, ident.1 = 8, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster9.markers <- FindMarkers(object = tiss, ident.1 = 9, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)
#cluster0.markers <- FindMarkers(object = tiss, ident.1 = 0, min.pct = 0.25, only.pos = TRUE, thresh.use = 0.25)

Which markers identify a specific cluster?

print(x = head(x = cluster6.markers, n = 30))

You can also compute all markers for all clusters at once. This may take some time.

tiss.markers <- FindAllMarkers(object = tiss, only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25)

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02m 53s      
   |++                                                | 2 % ~02m 37s      
   |++                                                | 3 % ~02m 17s      
   |+++                                               | 4 % ~02m 08s      
   |+++                                               | 6 % ~01m 60s      
   |++++                                              | 7 % ~01m 52s      
   |++++                                              | 8 % ~01m 47s      
   |+++++                                             | 9 % ~01m 43s      
   |+++++                                             | 10% ~01m 40s      
   |++++++                                            | 11% ~01m 37s      
   |+++++++                                           | 12% ~01m 34s      
   |+++++++                                           | 13% ~01m 32s      
   |++++++++                                          | 14% ~01m 29s      
   |++++++++                                          | 16% ~01m 28s      
   |+++++++++                                         | 17% ~01m 26s      
   |+++++++++                                         | 18% ~01m 24s      
   |++++++++++                                        | 19% ~01m 23s      
   |++++++++++                                        | 20% ~01m 21s      
   |+++++++++++                                       | 21% ~01m 19s      
   |++++++++++++                                      | 22% ~01m 18s      
   |++++++++++++                                      | 23% ~01m 16s      
   |+++++++++++++                                     | 24% ~01m 15s      
   |+++++++++++++                                     | 26% ~01m 14s      
   |++++++++++++++                                    | 27% ~01m 12s      
   |++++++++++++++                                    | 28% ~01m 11s      
   |+++++++++++++++                                   | 29% ~01m 10s      
   |+++++++++++++++                                   | 30% ~01m 09s      
   |++++++++++++++++                                  | 31% ~01m 08s      
   |+++++++++++++++++                                 | 32% ~01m 06s      
   |+++++++++++++++++                                 | 33% ~01m 05s      
   |++++++++++++++++++                                | 34% ~01m 04s      
   |++++++++++++++++++                                | 36% ~01m 03s      
   |+++++++++++++++++++                               | 37% ~01m 02s      
   |+++++++++++++++++++                               | 38% ~01m 01s      
   |++++++++++++++++++++                              | 39% ~60s          
   |++++++++++++++++++++                              | 40% ~59s          
   |+++++++++++++++++++++                             | 41% ~58s          
   |++++++++++++++++++++++                            | 42% ~56s          
   |++++++++++++++++++++++                            | 43% ~55s          
   |+++++++++++++++++++++++                           | 44% ~54s          
   |+++++++++++++++++++++++                           | 46% ~53s          
   |++++++++++++++++++++++++                          | 47% ~52s          
   |++++++++++++++++++++++++                          | 48% ~51s          
   |+++++++++++++++++++++++++                         | 49% ~50s          
   |+++++++++++++++++++++++++                         | 50% ~49s          
   |++++++++++++++++++++++++++                        | 51% ~48s          
   |+++++++++++++++++++++++++++                       | 52% ~47s          
   |+++++++++++++++++++++++++++                       | 53% ~46s          
   |++++++++++++++++++++++++++++                      | 54% ~45s          
   |++++++++++++++++++++++++++++                      | 56% ~44s          
   |+++++++++++++++++++++++++++++                     | 57% ~42s          
   |+++++++++++++++++++++++++++++                     | 58% ~41s          
   |++++++++++++++++++++++++++++++                    | 59% ~40s          
   |++++++++++++++++++++++++++++++                    | 60% ~39s          
   |+++++++++++++++++++++++++++++++                   | 61% ~38s          
   |++++++++++++++++++++++++++++++++                  | 62% ~37s          
   |++++++++++++++++++++++++++++++++                  | 63% ~36s          
   |+++++++++++++++++++++++++++++++++                 | 64% ~35s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~34s          
   |++++++++++++++++++++++++++++++++++                | 67% ~33s          
   |++++++++++++++++++++++++++++++++++                | 68% ~32s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~31s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~30s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~29s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~28s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~27s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~26s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~25s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~24s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~23s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~22s          
   |++++++++++++++++++++++++++++++++++++++++         | 80% ~21s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~20s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~15s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++++    | 90% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 47s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~53s          
   |++                                                | 2 % ~51s          
   |++                                                | 4 % ~53s          
   |+++                                               | 5 % ~52s          
   |+++                                               | 6 % ~51s          
   |++++                                              | 7 % ~50s          
   |+++++                                             | 8 % ~49s          
   |+++++                                             | 10% ~48s          
   |++++++                                            | 11% ~47s          
   |++++++                                            | 12% ~46s          
   |+++++++                                           | 13% ~46s          
   |++++++++                                          | 14% ~45s          
   |++++++++                                          | 15% ~44s          
   |+++++++++                                         | 17% ~44s          
   |+++++++++                                         | 18% ~43s          
   |++++++++++                                        | 19% ~42s          
   |+++++++++++                                       | 20% ~42s          
   |+++++++++++                                       | 21% ~41s          
   |++++++++++++                                      | 23% ~41s          
   |++++++++++++                                      | 24% ~40s          
   |+++++++++++++                                     | 25% ~40s          
   |++++++++++++++                                    | 26% ~39s          
   |++++++++++++++                                    | 27% ~39s          
   |+++++++++++++++                                   | 29% ~38s          
   |+++++++++++++++                                   | 30% ~37s          
   |++++++++++++++++                                  | 31% ~36s          
   |+++++++++++++++++                                 | 32% ~36s          
   |+++++++++++++++++                                 | 33% ~35s          
   |++++++++++++++++++                                | 35% ~34s          
   |++++++++++++++++++                                | 36% ~34s          
   |+++++++++++++++++++                               | 37% ~33s          
   |++++++++++++++++++++                              | 38% ~32s          
   |++++++++++++++++++++                              | 39% ~32s          
   |+++++++++++++++++++++                             | 40% ~32s          
   |+++++++++++++++++++++                             | 42% ~31s          
   |++++++++++++++++++++++                            | 43% ~31s          
   |+++++++++++++++++++++++                           | 44% ~30s          
   |+++++++++++++++++++++++                           | 45% ~29s          
   |++++++++++++++++++++++++                          | 46% ~29s          
   |++++++++++++++++++++++++                          | 48% ~28s          
   |+++++++++++++++++++++++++                         | 49% ~27s          
   |+++++++++++++++++++++++++                         | 50% ~27s          
   |++++++++++++++++++++++++++                        | 51% ~26s          
   |+++++++++++++++++++++++++++                       | 52% ~25s          
   |+++++++++++++++++++++++++++                       | 54% ~25s          
   |++++++++++++++++++++++++++++                      | 55% ~24s          
   |++++++++++++++++++++++++++++                      | 56% ~24s          
   |+++++++++++++++++++++++++++++                     | 57% ~23s          
   |++++++++++++++++++++++++++++++                    | 58% ~22s          
   |++++++++++++++++++++++++++++++                    | 60% ~22s          
   |+++++++++++++++++++++++++++++++                   | 61% ~21s          
   |+++++++++++++++++++++++++++++++                   | 62% ~20s          
   |++++++++++++++++++++++++++++++++                  | 63% ~20s          
   |+++++++++++++++++++++++++++++++++                 | 64% ~19s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~19s          
   |++++++++++++++++++++++++++++++++++                | 67% ~18s          
   |++++++++++++++++++++++++++++++++++                | 68% ~17s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~17s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~16s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~16s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~15s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~14s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~14s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~13s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~12s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~12s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 57s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02m 16s      
   |++                                                | 2 % ~02m 15s      
   |++                                                | 3 % ~02m 19s      
   |+++                                               | 4 % ~02m 15s      
   |+++                                               | 5 % ~02m 15s      
   |++++                                              | 6 % ~02m 14s      
   |++++                                              | 8 % ~02m 12s      
   |+++++                                             | 9 % ~02m 11s      
   |+++++                                             | 10% ~02m 08s      
   |++++++                                            | 11% ~02m 06s      
   |++++++                                            | 12% ~02m 04s      
   |+++++++                                           | 13% ~02m 02s      
   |+++++++                                           | 14% ~02m 00s      
   |++++++++                                          | 15% ~02m 03s      
   |+++++++++                                         | 16% ~02m 02s      
   |+++++++++                                         | 17% ~02m 04s      
   |++++++++++                                        | 18% ~02m 03s      
   |++++++++++                                        | 19% ~02m 01s      
   |+++++++++++                                       | 20% ~01m 60s      
   |+++++++++++                                       | 22% ~01m 58s      
   |++++++++++++                                      | 23% ~01m 57s      
   |++++++++++++                                      | 24% ~01m 55s      
   |+++++++++++++                                     | 25% ~01m 53s      
   |+++++++++++++                                     | 26% ~01m 51s      
   |++++++++++++++                                    | 27% ~01m 49s      
   |++++++++++++++                                    | 28% ~01m 47s      
   |+++++++++++++++                                   | 29% ~01m 46s      
   |++++++++++++++++                                  | 30% ~01m 44s      
   |++++++++++++++++                                  | 31% ~01m 43s      
   |+++++++++++++++++                                 | 32% ~01m 41s      
   |+++++++++++++++++                                 | 33% ~01m 39s      
   |++++++++++++++++++                                | 34% ~01m 38s      
   |++++++++++++++++++                                | 35% ~01m 37s      
   |+++++++++++++++++++                               | 37% ~01m 35s      
   |+++++++++++++++++++                               | 38% ~01m 33s      
   |++++++++++++++++++++                              | 39% ~01m 32s      
   |++++++++++++++++++++                              | 40% ~01m 31s      
   |+++++++++++++++++++++                             | 41% ~01m 29s      
   |+++++++++++++++++++++                             | 42% ~01m 28s      
   |++++++++++++++++++++++                            | 43% ~01m 26s      
   |+++++++++++++++++++++++                           | 44% ~01m 24s      
   |+++++++++++++++++++++++                           | 45% ~01m 23s      
   |++++++++++++++++++++++++                          | 46% ~01m 21s      
   |++++++++++++++++++++++++                          | 47% ~01m 20s      
   |+++++++++++++++++++++++++                         | 48% ~01m 18s      
   |+++++++++++++++++++++++++                         | 49% ~01m 16s      
   |++++++++++++++++++++++++++                        | 51% ~01m 15s      
   |++++++++++++++++++++++++++                        | 52% ~01m 13s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 11s      
   |+++++++++++++++++++++++++++                       | 54% ~01m 10s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 08s      
   |++++++++++++++++++++++++++++                      | 56% ~01m 07s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 05s      
   |++++++++++++++++++++++++++++++                    | 58% ~01m 04s      
   |++++++++++++++++++++++++++++++                    | 59% ~01m 02s      
   |+++++++++++++++++++++++++++++++                   | 60% ~01m 01s      
   |+++++++++++++++++++++++++++++++                   | 61% ~59s          
   |++++++++++++++++++++++++++++++++                  | 62% ~58s          
   |++++++++++++++++++++++++++++++++                  | 63% ~56s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~55s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~53s          
   |++++++++++++++++++++++++++++++++++                | 67% ~51s          
   |++++++++++++++++++++++++++++++++++                | 68% ~50s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~48s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~46s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~45s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~43s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~42s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~40s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~39s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~37s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~35s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~34s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~32s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~30s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~29s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~27s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~25s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~24s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~22s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~20s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~15s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~05s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 36s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 34s      
   |++                                                | 2 % ~01m 29s      
   |++                                                | 3 % ~01m 24s      
   |+++                                               | 4 % ~01m 21s      
   |+++                                               | 5 % ~01m 19s      
   |++++                                              | 6 % ~01m 19s      
   |++++                                              | 7 % ~01m 21s      
   |+++++                                             | 8 % ~01m 19s      
   |+++++                                             | 9 % ~01m 17s      
   |++++++                                            | 10% ~01m 16s      
   |++++++                                            | 11% ~01m 14s      
   |+++++++                                           | 12% ~01m 13s      
   |+++++++                                           | 13% ~01m 11s      
   |++++++++                                          | 14% ~01m 11s      
   |++++++++                                          | 15% ~01m 10s      
   |+++++++++                                         | 16% ~01m 09s      
   |+++++++++                                         | 18% ~01m 08s      
   |++++++++++                                        | 19% ~01m 09s      
   |++++++++++                                        | 20% ~01m 09s      
   |+++++++++++                                       | 21% ~01m 08s      
   |+++++++++++                                       | 22% ~01m 07s      
   |++++++++++++                                      | 23% ~01m 07s      
   |++++++++++++                                      | 24% ~01m 07s      
   |+++++++++++++                                     | 25% ~01m 06s      
   |+++++++++++++                                     | 26% ~01m 05s      
   |++++++++++++++                                    | 27% ~01m 05s      
   |++++++++++++++                                    | 28% ~01m 04s      
   |+++++++++++++++                                   | 29% ~01m 03s      
   |+++++++++++++++                                   | 30% ~01m 02s      
   |++++++++++++++++                                  | 31% ~01m 01s      
   |++++++++++++++++                                  | 32% ~01m 00s      
   |+++++++++++++++++                                 | 33% ~59s          
   |++++++++++++++++++                                | 34% ~58s          
   |++++++++++++++++++                                | 35% ~57s          
   |+++++++++++++++++++                               | 36% ~56s          
   |+++++++++++++++++++                               | 37% ~55s          
   |++++++++++++++++++++                              | 38% ~55s          
   |++++++++++++++++++++                              | 39% ~54s          
   |+++++++++++++++++++++                             | 40% ~53s          
   |+++++++++++++++++++++                             | 41% ~52s          
   |++++++++++++++++++++++                            | 42% ~51s          
   |++++++++++++++++++++++                            | 43% ~51s          
   |+++++++++++++++++++++++                           | 44% ~50s          
   |+++++++++++++++++++++++                           | 45% ~49s          
   |++++++++++++++++++++++++                          | 46% ~48s          
   |++++++++++++++++++++++++                          | 47% ~47s          
   |+++++++++++++++++++++++++                         | 48% ~46s          
   |+++++++++++++++++++++++++                         | 49% ~45s          
   |++++++++++++++++++++++++++                        | 51% ~45s          
   |++++++++++++++++++++++++++                        | 52% ~44s          
   |+++++++++++++++++++++++++++                       | 53% ~43s          
   |+++++++++++++++++++++++++++                       | 54% ~42s          
   |++++++++++++++++++++++++++++                      | 55% ~41s          
   |++++++++++++++++++++++++++++                      | 56% ~40s          
   |+++++++++++++++++++++++++++++                     | 57% ~39s          
   |+++++++++++++++++++++++++++++                     | 58% ~38s          
   |++++++++++++++++++++++++++++++                    | 59% ~37s          
   |++++++++++++++++++++++++++++++                    | 60% ~36s          
   |+++++++++++++++++++++++++++++++                   | 61% ~35s          
   |+++++++++++++++++++++++++++++++                   | 62% ~34s          
   |++++++++++++++++++++++++++++++++                  | 63% ~34s          
   |++++++++++++++++++++++++++++++++                  | 64% ~33s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~32s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~31s          
   |++++++++++++++++++++++++++++++++++                | 67% ~30s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~29s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~28s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~27s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~26s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~25s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~24s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~23s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~23s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~22s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~21s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~20s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~18s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~16s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~14s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~09s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~06s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 32s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~03m 05s      
   |++                                                | 2 % ~03m 06s      
   |++                                                | 3 % ~03m 13s      
   |+++                                               | 4 % ~03m 13s      
   |+++                                               | 5 % ~03m 12s      
   |++++                                              | 6 % ~03m 19s      
   |++++                                              | 7 % ~03m 20s      
   |+++++                                             | 8 % ~03m 49s      
   |+++++                                             | 9 % ~03m 46s      
   |++++++                                            | 10% ~03m 40s      
   |++++++                                            | 11% ~03m 33s      
   |+++++++                                           | 12% ~03m 27s      
   |+++++++                                           | 13% ~03m 23s      
   |++++++++                                          | 14% ~03m 19s      
   |++++++++                                          | 15% ~03m 14s      
   |+++++++++                                         | 16% ~03m 11s      
   |+++++++++                                         | 18% ~03m 08s      
   |++++++++++                                        | 19% ~03m 04s      
   |++++++++++                                        | 20% ~03m 01s      
   |+++++++++++                                       | 21% ~02m 58s      
   |+++++++++++                                       | 22% ~02m 55s      
   |++++++++++++                                      | 23% ~02m 52s      
   |++++++++++++                                      | 24% ~02m 50s      
   |+++++++++++++                                     | 25% ~02m 49s      
   |+++++++++++++                                     | 26% ~02m 46s      
   |++++++++++++++                                    | 27% ~02m 44s      
   |++++++++++++++                                    | 28% ~02m 41s      
   |+++++++++++++++                                   | 29% ~02m 38s      
   |+++++++++++++++                                   | 30% ~02m 38s      
   |++++++++++++++++                                  | 31% ~02m 36s      
   |++++++++++++++++                                  | 32% ~02m 35s      
   |+++++++++++++++++                                 | 33% ~02m 32s      
   |++++++++++++++++++                                | 34% ~02m 30s      
   |++++++++++++++++++                                | 35% ~02m 27s      
   |+++++++++++++++++++                               | 36% ~02m 24s      
   |+++++++++++++++++++                               | 37% ~02m 22s      
   |++++++++++++++++++++                              | 38% ~02m 19s      
   |++++++++++++++++++++                              | 39% ~02m 16s      
   |+++++++++++++++++++++                             | 40% ~02m 14s      
   |+++++++++++++++++++++                             | 41% ~02m 12s      
   |++++++++++++++++++++++                            | 42% ~02m 09s      
   |++++++++++++++++++++++                            | 43% ~02m 07s      
   |+++++++++++++++++++++++                           | 44% ~02m 05s      
   |+++++++++++++++++++++++                           | 45% ~02m 02s      
   |++++++++++++++++++++++++                          | 46% ~01m 60s      
   |++++++++++++++++++++++++                          | 47% ~01m 57s      
   |+++++++++++++++++++++++++                         | 48% ~01m 55s      
   |+++++++++++++++++++++++++                         | 49% ~01m 53s      
   |++++++++++++++++++++++++++                        | 51% ~01m 51s      
   |++++++++++++++++++++++++++                        | 52% ~01m 48s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 46s      
   |+++++++++++++++++++++++++++                       | 54% ~01m 43s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 41s      
   |++++++++++++++++++++++++++++                      | 56% ~01m 38s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 36s      
   |+++++++++++++++++++++++++++++                     | 58% ~01m 34s      
   |++++++++++++++++++++++++++++++                    | 59% ~01m 32s      
   |++++++++++++++++++++++++++++++                    | 60% ~01m 30s      
   |+++++++++++++++++++++++++++++++                   | 61% ~01m 28s      
   |+++++++++++++++++++++++++++++++                   | 62% ~01m 26s      
   |++++++++++++++++++++++++++++++++                  | 63% ~01m 23s      
   |++++++++++++++++++++++++++++++++                  | 64% ~01m 22s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~01m 19s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~01m 17s      
   |++++++++++++++++++++++++++++++++++                | 67% ~01m 15s      
   |+++++++++++++++++++++++++++++++++++               | 68% ~01m 13s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~01m 11s      
   |++++++++++++++++++++++++++++++++++++              | 70% ~01m 08s      
   |++++++++++++++++++++++++++++++++++++              | 71% ~01m 06s      
   |+++++++++++++++++++++++++++++++++++++             | 72% ~01m 04s      
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01m 01s      
   |++++++++++++++++++++++++++++++++++++++            | 74% ~59s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~56s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~54s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~52s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~49s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~47s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~45s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~43s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~40s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~38s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~35s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~33s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~31s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~28s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~26s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~24s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~21s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 03m 46s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 18s      
   |++                                                | 2 % ~01m 16s      
   |++                                                | 3 % ~01m 16s      
   |+++                                               | 5 % ~01m 13s      
   |+++                                               | 6 % ~01m 12s      
   |++++                                              | 7 % ~01m 11s      
   |+++++                                             | 8 % ~01m 11s      
   |+++++                                             | 9 % ~01m 09s      
   |++++++                                            | 10% ~01m 12s      
   |++++++                                            | 11% ~01m 12s      
   |+++++++                                           | 13% ~01m 11s      
   |+++++++                                           | 14% ~01m 11s      
   |++++++++                                          | 15% ~01m 12s      
   |+++++++++                                         | 16% ~01m 13s      
   |+++++++++                                         | 17% ~01m 12s      
   |++++++++++                                        | 18% ~01m 10s      
   |++++++++++                                        | 20% ~01m 09s      
   |+++++++++++                                       | 21% ~01m 08s      
   |+++++++++++                                       | 22% ~01m 06s      
   |++++++++++++                                      | 23% ~01m 05s      
   |+++++++++++++                                     | 24% ~01m 04s      
   |+++++++++++++                                     | 25% ~01m 03s      
   |++++++++++++++                                    | 26% ~01m 02s      
   |++++++++++++++                                    | 28% ~01m 02s      
   |+++++++++++++++                                   | 29% ~01m 01s      
   |+++++++++++++++                                   | 30% ~60s          
   |++++++++++++++++                                  | 31% ~58s          
   |+++++++++++++++++                                 | 32% ~57s          
   |+++++++++++++++++                                 | 33% ~56s          
   |++++++++++++++++++                                | 34% ~55s          
   |++++++++++++++++++                                | 36% ~54s          
   |+++++++++++++++++++                               | 37% ~53s          
   |+++++++++++++++++++                               | 38% ~52s          
   |++++++++++++++++++++                              | 39% ~51s          
   |+++++++++++++++++++++                             | 40% ~50s          
   |+++++++++++++++++++++                             | 41% ~49s          
   |++++++++++++++++++++++                            | 43% ~48s          
   |++++++++++++++++++++++                            | 44% ~47s          
   |+++++++++++++++++++++++                           | 45% ~46s          
   |+++++++++++++++++++++++                           | 46% ~45s          
   |++++++++++++++++++++++++                          | 47% ~44s          
   |+++++++++++++++++++++++++                         | 48% ~43s          
   |+++++++++++++++++++++++++                         | 49% ~42s          
   |++++++++++++++++++++++++++                        | 51% ~41s          
   |++++++++++++++++++++++++++                        | 52% ~40s          
   |+++++++++++++++++++++++++++                       | 53% ~39s          
   |++++++++++++++++++++++++++++                      | 54% ~38s          
   |++++++++++++++++++++++++++++                      | 55% ~37s          
   |+++++++++++++++++++++++++++++                     | 56% ~36s          
   |+++++++++++++++++++++++++++++                     | 57% ~35s          
   |++++++++++++++++++++++++++++++                    | 59% ~34s          
   |++++++++++++++++++++++++++++++                    | 60% ~33s          
   |+++++++++++++++++++++++++++++++                   | 61% ~32s          
   |++++++++++++++++++++++++++++++++                  | 62% ~31s          
   |++++++++++++++++++++++++++++++++                  | 63% ~30s          
   |+++++++++++++++++++++++++++++++++                 | 64% ~29s          
   |+++++++++++++++++++++++++++++++++                 | 66% ~28s          
   |++++++++++++++++++++++++++++++++++                | 67% ~27s          
   |++++++++++++++++++++++++++++++++++                | 68% ~26s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~25s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~24s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~23s          
   |+++++++++++++++++++++++++++++++++++++             | 72% ~22s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~21s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~20s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~19s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~19s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~18s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~16s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~15s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~08s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 19s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~02m 41s      
   |++                                                | 2 % ~02m 39s      
   |++                                                | 3 % ~02m 36s      
   |+++                                               | 4 % ~02m 33s      
   |+++                                               | 5 % ~02m 30s      
   |++++                                              | 7 % ~02m 29s      
   |++++                                              | 8 % ~02m 26s      
   |+++++                                             | 9 % ~02m 29s      
   |+++++                                             | 10% ~02m 26s      
   |++++++                                            | 11% ~02m 24s      
   |++++++                                            | 12% ~02m 22s      
   |+++++++                                           | 13% ~02m 20s      
   |++++++++                                          | 14% ~02m 17s      
   |++++++++                                          | 15% ~02m 15s      
   |+++++++++                                         | 16% ~02m 13s      
   |+++++++++                                         | 17% ~02m 14s      
   |++++++++++                                        | 18% ~02m 12s      
   |++++++++++                                        | 20% ~02m 10s      
   |+++++++++++                                       | 21% ~02m 08s      
   |+++++++++++                                       | 22% ~02m 05s      
   |++++++++++++                                      | 23% ~02m 03s      
   |++++++++++++                                      | 24% ~02m 02s      
   |+++++++++++++                                     | 25% ~01m 60s      
   |++++++++++++++                                    | 26% ~01m 58s      
   |++++++++++++++                                    | 27% ~01m 56s      
   |+++++++++++++++                                   | 28% ~01m 54s      
   |+++++++++++++++                                   | 29% ~01m 52s      
   |++++++++++++++++                                  | 30% ~01m 50s      
   |++++++++++++++++                                  | 32% ~01m 50s      
   |+++++++++++++++++                                 | 33% ~01m 48s      
   |+++++++++++++++++                                 | 34% ~01m 46s      
   |++++++++++++++++++                                | 35% ~01m 44s      
   |++++++++++++++++++                                | 36% ~01m 43s      
   |+++++++++++++++++++                               | 37% ~01m 41s      
   |++++++++++++++++++++                              | 38% ~01m 39s      
   |++++++++++++++++++++                              | 39% ~01m 37s      
   |+++++++++++++++++++++                             | 40% ~01m 35s      
   |+++++++++++++++++++++                             | 41% ~01m 34s      
   |++++++++++++++++++++++                            | 42% ~01m 32s      
   |++++++++++++++++++++++                            | 43% ~01m 31s      
   |+++++++++++++++++++++++                           | 45% ~01m 29s      
   |+++++++++++++++++++++++                           | 46% ~01m 30s      
   |++++++++++++++++++++++++                          | 47% ~01m 32s      
   |++++++++++++++++++++++++                          | 48% ~01m 30s      
   |+++++++++++++++++++++++++                         | 49% ~01m 28s      
   |+++++++++++++++++++++++++                         | 50% ~01m 26s      
   |++++++++++++++++++++++++++                        | 51% ~01m 24s      
   |+++++++++++++++++++++++++++                       | 52% ~01m 22s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 20s      
   |++++++++++++++++++++++++++++                      | 54% ~01m 18s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 16s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 14s      
   |+++++++++++++++++++++++++++++                     | 58% ~01m 12s      
   |++++++++++++++++++++++++++++++                    | 59% ~01m 10s      
   |++++++++++++++++++++++++++++++                    | 60% ~01m 08s      
   |+++++++++++++++++++++++++++++++                   | 61% ~01m 07s      
   |+++++++++++++++++++++++++++++++                   | 62% ~01m 05s      
   |++++++++++++++++++++++++++++++++                  | 63% ~01m 03s      
   |+++++++++++++++++++++++++++++++++                 | 64% ~01m 01s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~59s          
   |++++++++++++++++++++++++++++++++++                | 66% ~57s          
   |++++++++++++++++++++++++++++++++++                | 67% ~55s          
   |+++++++++++++++++++++++++++++++++++               | 68% ~53s          
   |+++++++++++++++++++++++++++++++++++               | 70% ~51s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~50s          
   |++++++++++++++++++++++++++++++++++++              | 72% ~49s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~47s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~45s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~43s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~41s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~39s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~37s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~35s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~33s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~31s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~30s          
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~28s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~26s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~24s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~22s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~20s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~18s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~17s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~15s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~11s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~09s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 02m 49s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~01m 06s      
   |++                                                | 2 % ~01m 07s      
   |++                                                | 4 % ~01m 06s      
   |+++                                               | 5 % ~01m 05s      
   |+++                                               | 6 % ~01m 04s      
   |++++                                              | 7 % ~01m 03s      
   |+++++                                             | 8 % ~01m 02s      
   |+++++                                             | 10% ~01m 01s      
   |++++++                                            | 11% ~01m 00s      
   |++++++                                            | 12% ~59s          
   |+++++++                                           | 13% ~59s          
   |++++++++                                          | 14% ~58s          
   |++++++++                                          | 15% ~58s          
   |+++++++++                                         | 17% ~57s          
   |+++++++++                                         | 18% ~56s          
   |++++++++++                                        | 19% ~55s          
   |+++++++++++                                       | 20% ~54s          
   |+++++++++++                                       | 21% ~53s          
   |++++++++++++                                      | 23% ~53s          
   |++++++++++++                                      | 24% ~53s          
   |+++++++++++++                                     | 25% ~52s          
   |++++++++++++++                                    | 26% ~51s          
   |++++++++++++++                                    | 27% ~50s          
   |+++++++++++++++                                   | 29% ~49s          
   |+++++++++++++++                                   | 30% ~49s          
   |++++++++++++++++                                  | 31% ~48s          
   |+++++++++++++++++                                 | 32% ~47s          
   |+++++++++++++++++                                 | 33% ~46s          
   |++++++++++++++++++                                | 35% ~45s          
   |++++++++++++++++++                                | 36% ~44s          
   |+++++++++++++++++++                               | 37% ~43s          
   |++++++++++++++++++++                              | 38% ~43s          
   |++++++++++++++++++++                              | 39% ~42s          
   |+++++++++++++++++++++                             | 40% ~41s          
   |+++++++++++++++++++++                             | 42% ~40s          
   |++++++++++++++++++++++                            | 43% ~39s          
   |+++++++++++++++++++++++                           | 44% ~38s          
   |+++++++++++++++++++++++                           | 45% ~38s          
   |++++++++++++++++++++++++                          | 46% ~37s          
   |++++++++++++++++++++++++                          | 48% ~36s          
   |+++++++++++++++++++++++++                         | 49% ~35s          
   |+++++++++++++++++++++++++                         | 50% ~34s          
   |++++++++++++++++++++++++++                        | 51% ~33s          
   |+++++++++++++++++++++++++++                       | 52% ~33s          
   |+++++++++++++++++++++++++++                       | 54% ~32s          
   |++++++++++++++++++++++++++++                      | 55% ~31s          
   |++++++++++++++++++++++++++++                      | 56% ~31s          
   |+++++++++++++++++++++++++++++                     | 57% ~30s          
   |++++++++++++++++++++++++++++++                    | 58% ~29s          
   |++++++++++++++++++++++++++++++                    | 60% ~28s          
   |+++++++++++++++++++++++++++++++                   | 61% ~27s          
   |+++++++++++++++++++++++++++++++                   | 62% ~26s          
   |++++++++++++++++++++++++++++++++                  | 63% ~26s          
   |+++++++++++++++++++++++++++++++++                 | 64% ~25s          
   |+++++++++++++++++++++++++++++++++                 | 65% ~24s          
   |++++++++++++++++++++++++++++++++++                | 67% ~23s          
   |++++++++++++++++++++++++++++++++++                | 68% ~22s          
   |+++++++++++++++++++++++++++++++++++               | 69% ~21s          
   |++++++++++++++++++++++++++++++++++++              | 70% ~21s          
   |++++++++++++++++++++++++++++++++++++              | 71% ~20s          
   |+++++++++++++++++++++++++++++++++++++             | 73% ~19s          
   |+++++++++++++++++++++++++++++++++++++             | 74% ~18s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~17s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~17s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~16s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~15s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~14s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~13s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~12s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~11s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~10s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~09s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~08s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~07s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~02s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 01m 11s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~03m 39s      
   |++                                                | 2 % ~03m 36s      
   |++                                                | 3 % ~03m 35s      
   |+++                                               | 4 % ~03m 32s      
   |+++                                               | 5 % ~03m 30s      
   |++++                                              | 6 % ~03m 28s      
   |++++                                              | 7 % ~03m 25s      
   |+++++                                             | 8 % ~03m 23s      
   |+++++                                             | 9 % ~03m 20s      
   |++++++                                            | 10% ~03m 18s      
   |++++++                                            | 11% ~03m 17s      
   |+++++++                                           | 12% ~03m 15s      
   |+++++++                                           | 14% ~03m 13s      
   |++++++++                                          | 15% ~03m 13s      
   |++++++++                                          | 16% ~03m 14s      
   |+++++++++                                         | 17% ~03m 12s      
   |+++++++++                                         | 18% ~03m 09s      
   |++++++++++                                        | 19% ~03m 07s      
   |++++++++++                                        | 20% ~03m 04s      
   |+++++++++++                                       | 21% ~03m 02s      
   |+++++++++++                                       | 22% ~02m 59s      
   |++++++++++++                                      | 23% ~02m 57s      
   |++++++++++++                                      | 24% ~02m 54s      
   |+++++++++++++                                     | 25% ~02m 51s      
   |++++++++++++++                                    | 26% ~02m 49s      
   |++++++++++++++                                    | 27% ~02m 46s      
   |+++++++++++++++                                   | 28% ~02m 44s      
   |+++++++++++++++                                   | 29% ~02m 42s      
   |++++++++++++++++                                  | 30% ~02m 40s      
   |++++++++++++++++                                  | 31% ~02m 37s      
   |+++++++++++++++++                                 | 32% ~02m 35s      
   |+++++++++++++++++                                 | 33% ~02m 32s      
   |++++++++++++++++++                                | 34% ~02m 30s      
   |++++++++++++++++++                                | 35% ~02m 27s      
   |+++++++++++++++++++                               | 36% ~02m 25s      
   |+++++++++++++++++++                               | 38% ~02m 22s      
   |++++++++++++++++++++                              | 39% ~02m 21s      
   |++++++++++++++++++++                              | 40% ~02m 19s      
   |+++++++++++++++++++++                             | 41% ~02m 16s      
   |+++++++++++++++++++++                             | 42% ~02m 14s      
   |++++++++++++++++++++++                            | 43% ~02m 11s      
   |++++++++++++++++++++++                            | 44% ~02m 09s      
   |+++++++++++++++++++++++                           | 45% ~02m 07s      
   |+++++++++++++++++++++++                           | 46% ~02m 04s      
   |++++++++++++++++++++++++                          | 47% ~02m 04s      
   |++++++++++++++++++++++++                          | 48% ~02m 01s      
   |+++++++++++++++++++++++++                         | 49% ~01m 59s      
   |+++++++++++++++++++++++++                         | 50% ~01m 56s      
   |++++++++++++++++++++++++++                        | 51% ~01m 54s      
   |+++++++++++++++++++++++++++                       | 52% ~01m 52s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 49s      
   |++++++++++++++++++++++++++++                      | 54% ~01m 46s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 44s      
   |+++++++++++++++++++++++++++++                     | 56% ~01m 41s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 39s      
   |++++++++++++++++++++++++++++++                    | 58% ~01m 36s      
   |++++++++++++++++++++++++++++++                    | 59% ~01m 34s      
   |+++++++++++++++++++++++++++++++                   | 60% ~01m 31s      
   |+++++++++++++++++++++++++++++++                   | 61% ~01m 29s      
   |++++++++++++++++++++++++++++++++                  | 62% ~01m 27s      
   |++++++++++++++++++++++++++++++++                  | 64% ~01m 24s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~01m 22s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~01m 19s      
   |++++++++++++++++++++++++++++++++++                | 67% ~01m 17s      
   |++++++++++++++++++++++++++++++++++                | 68% ~01m 14s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~01m 12s      
   |+++++++++++++++++++++++++++++++++++               | 70% ~01m 09s      
   |++++++++++++++++++++++++++++++++++++              | 71% ~01m 07s      
   |++++++++++++++++++++++++++++++++++++              | 72% ~01m 05s      
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01m 02s      
   |+++++++++++++++++++++++++++++++++++++             | 74% ~60s          
   |++++++++++++++++++++++++++++++++++++++            | 75% ~58s          
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~55s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~53s          
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~50s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~48s          
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~45s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~43s          
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~41s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~38s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~36s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~33s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~31s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~29s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~26s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~24s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~21s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 03m 48s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~03m 35s      
   |++                                                | 2 % ~04m 03s      
   |++                                                | 3 % ~03m 51s      
   |+++                                               | 4 % ~03m 43s      
   |+++                                               | 5 % ~03m 37s      
   |++++                                              | 6 % ~03m 34s      
   |++++                                              | 7 % ~03m 30s      
   |+++++                                             | 9 % ~03m 27s      
   |+++++                                             | 10% ~03m 23s      
   |++++++                                            | 11% ~03m 20s      
   |++++++                                            | 12% ~03m 18s      
   |+++++++                                           | 13% ~03m 15s      
   |+++++++                                           | 14% ~03m 12s      
   |++++++++                                          | 15% ~03m 09s      
   |++++++++                                          | 16% ~03m 07s      
   |+++++++++                                         | 17% ~03m 06s      
   |++++++++++                                        | 18% ~03m 04s      
   |++++++++++                                        | 19% ~03m 02s      
   |+++++++++++                                       | 20% ~02m 59s      
   |+++++++++++                                       | 21% ~02m 56s      
   |++++++++++++                                      | 22% ~02m 54s      
   |++++++++++++                                      | 23% ~02m 51s      
   |+++++++++++++                                     | 24% ~02m 49s      
   |+++++++++++++                                     | 26% ~02m 46s      
   |++++++++++++++                                    | 27% ~02m 46s      
   |++++++++++++++                                    | 28% ~02m 43s      
   |+++++++++++++++                                   | 29% ~02m 40s      
   |+++++++++++++++                                   | 30% ~02m 40s      
   |++++++++++++++++                                  | 31% ~02m 37s      
   |++++++++++++++++                                  | 32% ~02m 35s      
   |+++++++++++++++++                                 | 33% ~02m 32s      
   |++++++++++++++++++                                | 34% ~02m 29s      
   |++++++++++++++++++                                | 35% ~02m 31s      
   |+++++++++++++++++++                               | 36% ~02m 28s      
   |+++++++++++++++++++                               | 37% ~02m 25s      
   |++++++++++++++++++++                              | 38% ~02m 23s      
   |++++++++++++++++++++                              | 39% ~02m 20s      
   |+++++++++++++++++++++                             | 40% ~02m 17s      
   |+++++++++++++++++++++                             | 41% ~02m 14s      
   |++++++++++++++++++++++                            | 43% ~02m 12s      
   |++++++++++++++++++++++                            | 44% ~02m 09s      
   |+++++++++++++++++++++++                           | 45% ~02m 06s      
   |+++++++++++++++++++++++                           | 46% ~02m 04s      
   |++++++++++++++++++++++++                          | 47% ~02m 01s      
   |++++++++++++++++++++++++                          | 48% ~01m 59s      
   |+++++++++++++++++++++++++                         | 49% ~01m 56s      
   |+++++++++++++++++++++++++                         | 50% ~01m 54s      
   |++++++++++++++++++++++++++                        | 51% ~01m 51s      
   |+++++++++++++++++++++++++++                       | 52% ~01m 49s      
   |+++++++++++++++++++++++++++                       | 53% ~01m 46s      
   |++++++++++++++++++++++++++++                      | 54% ~01m 43s      
   |++++++++++++++++++++++++++++                      | 55% ~01m 41s      
   |+++++++++++++++++++++++++++++                     | 56% ~01m 38s      
   |+++++++++++++++++++++++++++++                     | 57% ~01m 36s      
   |++++++++++++++++++++++++++++++                    | 59% ~01m 33s      
   |++++++++++++++++++++++++++++++                    | 60% ~01m 31s      
   |+++++++++++++++++++++++++++++++                   | 61% ~01m 29s      
   |+++++++++++++++++++++++++++++++                   | 62% ~01m 26s      
   |++++++++++++++++++++++++++++++++                  | 63% ~01m 24s      
   |++++++++++++++++++++++++++++++++                  | 64% ~01m 22s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~01m 19s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~01m 17s      
   |++++++++++++++++++++++++++++++++++                | 67% ~01m 14s      
   |+++++++++++++++++++++++++++++++++++               | 68% ~01m 12s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~01m 09s      
   |++++++++++++++++++++++++++++++++++++              | 70% ~01m 07s      
   |++++++++++++++++++++++++++++++++++++              | 71% ~01m 05s      
   |+++++++++++++++++++++++++++++++++++++             | 72% ~01m 02s      
   |+++++++++++++++++++++++++++++++++++++             | 73% ~60s          
   |++++++++++++++++++++++++++++++++++++++            | 74% ~57s          
   |++++++++++++++++++++++++++++++++++++++            | 76% ~55s          
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~52s          
   |+++++++++++++++++++++++++++++++++++++++           | 78% ~50s          
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~48s          
   |++++++++++++++++++++++++++++++++++++++++          | 80% ~46s          
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~43s          
   |+++++++++++++++++++++++++++++++++++++++++         | 82% ~41s          
   |++++++++++++++++++++++++++++++++++++++++++        | 83% ~39s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~36s          
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~34s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~32s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~29s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~27s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~24s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~22s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~19s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~14s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~12s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~10s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~07s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~05s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 03m 46s

   |                                                  | 0 % ~calculating  
   |+                                                 | 1 % ~06m 35s      
   |++                                                | 2 % ~06m 32s      
   |++                                                | 3 % ~06m 25s      
   |+++                                               | 4 % ~06m 22s      
   |+++                                               | 5 % ~06m 18s      
   |++++                                              | 6 % ~06m 13s      
   |++++                                              | 7 % ~06m 09s      
   |+++++                                             | 8 % ~06m 04s      
   |+++++                                             | 9 % ~06m 01s      
   |++++++                                            | 10% ~05m 58s      
   |++++++                                            | 11% ~05m 55s      
   |+++++++                                           | 12% ~05m 50s      
   |+++++++                                           | 13% ~05m 46s      
   |++++++++                                          | 14% ~05m 42s      
   |++++++++                                          | 15% ~05m 39s      
   |+++++++++                                         | 16% ~05m 39s      
   |+++++++++                                         | 18% ~05m 34s      
   |++++++++++                                        | 19% ~05m 30s      
   |++++++++++                                        | 20% ~05m 26s      
   |+++++++++++                                       | 21% ~05m 22s      
   |+++++++++++                                       | 22% ~05m 17s      
   |++++++++++++                                      | 23% ~05m 13s      
   |++++++++++++                                      | 24% ~05m 09s      
   |+++++++++++++                                     | 25% ~05m 04s      
   |+++++++++++++                                     | 26% ~04m 60s      
   |++++++++++++++                                    | 27% ~04m 56s      
   |++++++++++++++                                    | 28% ~04m 52s      
   |+++++++++++++++                                   | 29% ~04m 49s      
   |+++++++++++++++                                   | 30% ~04m 45s      
   |++++++++++++++++                                  | 31% ~04m 41s      
   |++++++++++++++++                                  | 32% ~04m 36s      
   |+++++++++++++++++                                 | 33% ~04m 32s      
   |++++++++++++++++++                                | 34% ~04m 28s      
   |++++++++++++++++++                                | 35% ~04m 26s      
   |+++++++++++++++++++                               | 36% ~04m 21s      
   |+++++++++++++++++++                               | 37% ~04m 17s      
   |++++++++++++++++++++                              | 38% ~04m 13s      
   |++++++++++++++++++++                              | 39% ~04m 09s      
   |+++++++++++++++++++++                             | 40% ~04m 05s      
   |+++++++++++++++++++++                             | 41% ~04m 00s      
   |++++++++++++++++++++++                            | 42% ~03m 56s      
   |++++++++++++++++++++++                            | 43% ~03m 51s      
   |+++++++++++++++++++++++                           | 44% ~03m 47s      
   |+++++++++++++++++++++++                           | 45% ~03m 44s      
   |++++++++++++++++++++++++                          | 46% ~03m 40s      
   |++++++++++++++++++++++++                          | 47% ~03m 36s      
   |+++++++++++++++++++++++++                         | 48% ~03m 31s      
   |+++++++++++++++++++++++++                         | 49% ~03m 27s      
   |++++++++++++++++++++++++++                        | 51% ~03m 23s      
   |++++++++++++++++++++++++++                        | 52% ~03m 19s      
   |+++++++++++++++++++++++++++                       | 53% ~03m 15s      
   |+++++++++++++++++++++++++++                       | 54% ~03m 11s      
   |++++++++++++++++++++++++++++                      | 55% ~03m 07s      
   |++++++++++++++++++++++++++++                      | 56% ~03m 02s      
   |+++++++++++++++++++++++++++++                     | 57% ~02m 58s      
   |+++++++++++++++++++++++++++++                     | 58% ~02m 54s      
   |++++++++++++++++++++++++++++++                    | 59% ~02m 50s      
   |++++++++++++++++++++++++++++++                    | 60% ~02m 46s      
   |+++++++++++++++++++++++++++++++                   | 61% ~02m 41s      
   |+++++++++++++++++++++++++++++++                   | 62% ~02m 38s      
   |++++++++++++++++++++++++++++++++                  | 63% ~02m 34s      
   |++++++++++++++++++++++++++++++++                  | 64% ~02m 30s      
   |+++++++++++++++++++++++++++++++++                 | 65% ~02m 25s      
   |+++++++++++++++++++++++++++++++++                 | 66% ~02m 21s      
   |++++++++++++++++++++++++++++++++++                | 67% ~02m 17s      
   |+++++++++++++++++++++++++++++++++++               | 68% ~02m 12s      
   |+++++++++++++++++++++++++++++++++++               | 69% ~02m 08s      
   |++++++++++++++++++++++++++++++++++++              | 70% ~02m 04s      
   |++++++++++++++++++++++++++++++++++++              | 71% ~01m 59s      
   |+++++++++++++++++++++++++++++++++++++             | 72% ~01m 55s      
   |+++++++++++++++++++++++++++++++++++++             | 73% ~01m 51s      
   |++++++++++++++++++++++++++++++++++++++            | 74% ~01m 46s      
   |++++++++++++++++++++++++++++++++++++++            | 75% ~01m 42s      
   |+++++++++++++++++++++++++++++++++++++++           | 76% ~01m 38s      
   |+++++++++++++++++++++++++++++++++++++++           | 77% ~01m 34s      
   |++++++++++++++++++++++++++++++++++++++++          | 78% ~01m 29s      
   |++++++++++++++++++++++++++++++++++++++++          | 79% ~01m 25s      
   |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01m 21s      
   |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01m 17s      
   |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01m 12s      
   |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01m 08s      
   |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01m 04s      
   |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~60s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~55s          
   |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~51s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~47s          
   |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~43s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~38s          
   |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~34s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~30s          
   |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~26s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~21s          
   |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~17s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~13s          
   |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~09s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~04s          
   |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed = 06m 50s

Display the top markers you computed above.

tiss.markers %>% group_by(cluster) %>% top_n(20, avg_logFC)

Generate an expression heatmap for given cells and genes. In this case, we are plotting the top 20 markers (or all markers if less than 20) for each cluster.

Assigning cell type identity to clusters

At a coarse level, we can use canonical markers to match the unbiased clustering to known cell types: Cluster 0: basal cell of epidermis (CL:0002187) Cluster 1: differentiated keratinocytes (CL:0000312) Cluster 2: proliferating basal cell of epidermis (CL:0002187) Clutser 3: basal cell of epidermis (CL:0002187) Cluster 4: suprabasal differentiating keratinocytes (CL:0000312) Cluster 5: basal cell of epidermis (CL:0002187) Cluster 6: suprabasal differentiated keratinocytes (CL:0000312) Cluster 7: basal cell of epidermis (CL:0002187) Clutser 8: suprabasal differentiated keratinocytes (CL:0000312) Cluster 9: filiform differentiated keratinocytes (CL:0000312) Cluster 10: Langerhans cells (CL:0000453)

# stash current cluster IDs
tiss <- StashIdent(object = tiss, save.name = "cluster.ids")
# enumerate current cluster IDs and the labels for them
cluster.ids <- c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
free_annotation <- c(
 "basal_cells", 
 "differentiated", 
 "proliferating", 
 "basal_cells", 
 "suprabasal_differentiating", 
 "basal_cells", 
 "suprabasal_differentiated", 
 "basal_cells", 
 "suprabasal_differentiated", 
 "filiform_differentiated", 
 "Langerhans cells"
 )
cell_ontology_class <- c(
"basal cell of epidermis", 
"keratinocyte", 
"basal cell of epidermis",
"basal cell of epidermis",
"keratinocyte",
"basal cell of epidermis",
"keratinocyte",
"basal cell of epidermis",
"keratinocyte",
"keratinocyte",
 "Langerhans cells"
 )
cell_ontology_id <- c(
"CL:0002187",
"CL:0000312", 
"CL:0002187", 
"CL:0002187", 
"CL:0000312", 
"CL:0002187", 
"CL:0000312", 
"CL:0002187", 
"CL:0000312", 
"CL:0000312", 
"CL:0000453"
)
tiss@meta.data[,'free_annotation'] <- plyr::mapvalues(x = tiss@ident, from = cluster.ids, to = free_annotation)
tiss@meta.data[,'cell_ontology_class'] <- plyr::mapvalues(x = tiss@ident, from = cluster.ids, to = cell_ontology_class)
tiss@meta.data[,'cell_ontology_id'] <- plyr::mapvalues(x = tiss@ident, from = cluster.ids, to = cell_ontology_id)
tiss@meta.data[tiss@cell.names,'free_annotation'] <- as.character(tiss@meta.data$free_annotation)
tiss@meta.data[tiss@cell.names,'cell_ontology_class'] <- as.character(tiss@meta.data$cell_ontology_class)
tiss@meta.data[tiss@cell.names,'cell_ontology_id'] <- as.character(tiss@meta.data$cell_ontology_id)
TSNEPlot(object = tiss, do.label = TRUE, pt.size = 0.5, group.by='cell_ontology_class')

Supplementary Figures

Fig. suppTongue1. tSNE based on free annotation

Fig. suppTongue2. Expression of genes used for annotation of the clusters. Feature plot from both platforms on: Top2a, Cdc20, Mki67, Krt15, Krt5, Krt14, Sbsn, Krt10, Krt4, Krt13, Krt36, Krt84, Hoxc13

Fig. suppTongue3. Expression of genes known to be expressed in taste receptor cells. Violin plot from both platforms on: Krt8, Tas1r1, Tas1r2, Tas1r3, Ncam1, Car4

Checking for batch effects

Color by metadata, like plate barcode, to check for batch effects.

TSNEPlot(object = tiss, do.return = TRUE, group.by = "channel")

TSNEPlot(object = tiss, do.return = TRUE, group.by = "mouse.sex")

Print a table showing the count of cells in each identity category from each plate.

table(as.character(tiss@ident), as.character(tiss@meta.data$channel))
    
     10X_P4_0 10X_P4_1 10X_P7_10
  0       655      521       213
  1       505      296       294
  10       16       10        12
  2       315      317       447
  3       369      348       152
  4       394      271       150
  5       227      112       263
  6       229      252       120
  7       160      221       104
  8       153       65       148
  9        78       75        46

Save the Robject for later

When you save the annotated tissue, please give it a name.

filename = here('00_data_ingest', '04_tissue_robj_generated', 
          paste0("droplet", tissue_of_interest, "_seurat_tiss.Robj"))
print(filename)
[1] "/Users/Jintonic/Documents/GitHub/tabula-muris/00_data_ingest/04_tissue_robj_generated/dropletTongue_seurat_tiss.Robj"
save(tiss, file=filename)
# To reload a saved object
filename = here('00_data_ingest', '04_tissue_robj_generated', 
                      paste0("droplet", tissue_of_interest, "_seurat_tiss.Robj"))
 load(file=filename)

Export the final metadata

So that Biohub can easily combine all your cell_ontology_classs, please export them as a simple csv.

head(tiss@meta.data)
filename = here('00_data_ingest', '03_tissue_annotation_csv', 
          paste0(tissue_of_interest, "_droplet_cell_ontology_class.csv"))
write.csv(FetchData(tiss, c('channel','cell_ontology_class','cell_ontology_id', 'free_annotation', 'tSNE_1', 'tSNE_2')), file=filename)
LS0tCiB0aXRsZTogIlRvbmd1ZSBEcm9wbGV0IE5vdGVib29rIgogb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKU3BlY2lmeSB0aGUgdGlzc3VlIG9mIGludGVyZXN0LCBydW4gdGhlIGJvaWxlcnBsYXRlIGNvZGUgd2hpY2ggc2V0cyB1cCB0aGUgZnVuY3Rpb25zIGFuZCBlbnZpcm9ubWVudCwgbG9hZCB0aGUgdGlzc3VlIG9iamVjdC4KCmBgYHtyfQp0aXNzdWVfb2ZfaW50ZXJlc3QgPSAiVG9uZ3VlIgpsaWJyYXJ5KGhlcmUpCnNvdXJjZShoZXJlKCIwMF9kYXRhX2luZ2VzdCIsICIwMl90aXNzdWVfYW5hbHlzaXNfcm1kIiwgImJvaWxlcnBsYXRlLlIiKSkKdGlzcyA9IGxvYWRfdGlzc3VlX2Ryb3BsZXQodGlzc3VlX29mX2ludGVyZXN0KQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTE2LCBmaWcud2lkdGg9OH0KI1BDSGVhdG1hcChvYmplY3QgPSB0aXNzLCBwYy51c2UgPSAxOjMsIGNlbGxzLnVzZSA9IDUwMCwgZG8uYmFsYW5jZWQgPSBUUlVFLCBsYWJlbC5jb2x1bW5zID0gRkFMU0UsIG51bS5nZW5lcyA9IDgpClBDSGVhdG1hcChvYmplY3QgPSB0aXNzLCBwYy51c2UgPSAxOjEwLCBjZWxscy51c2UgPSA1MDAsIGRvLmJhbGFuY2VkID0gVFJVRSwgCiAgICBsYWJlbC5jb2x1bW5zID0gRkFMU0UsIHVzZS5mdWxsID0gRkFMU0UpCmBgYAoKTGF0ZXIgb24gKGluIEZpbmRDbHVzdGVycyBhbmQgVFNORSkgeW91IHdpbGwgcGljayBhIG51bWJlciBvZiBwcmluY2lwYWwgY29tcG9uZW50cyB0byB1c2UuIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2Yga2VlcGluZyB0aGUgbWFqb3IgZGlyZWN0aW9ucyBvZiB2YXJpYXRpb24gaW4gdGhlIGRhdGEgYW5kLCBpZGVhbGx5LCBzdXByZXNzaW5nIG5vaXNlLiBUaGVyZSBpcyBubyBjb3JyZWN0IGFuc3dlciB0byB0aGUgbnVtYmVyIHRvIHVzZSwgYnV0IGEgZGVjZW50IHJ1bGUgb2YgdGh1bWIgaXMgdG8gZ28gdW50aWwgdGhlIHBsb3QgcGxhdGVhdXMuCgpgYGB7cn0KUENFbGJvd1Bsb3Qob2JqZWN0ID0gdGlzcykKYGBgCgpDaG9vc2UgdGhlIG51bWJlciBvZiBwcmluY2lwYWwgY29tcG9uZW50cyB0byB1c2UuCmBgYHtyfQojIFNldCBudW1iZXIgb2YgcHJpbmNpcGFsIGNvbXBvbmVudHMuIApuLnBjcyA9IDE0CmBgYAoKClRoZSBjbHVzdGVyaW5nIGlzIHBlcmZvcm1lZCBiYXNlZCBvbiBhIG5lYXJlc3QgbmVpZ2hib3JzIGdyYXBoLiBDZWxscyB0aGF0IGhhdmUgc2ltaWxhciBleHByZXNzaW9uIHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyLiBUaGUgTG91dmFpbiBhbGdvcml0aG0gbG9va3MgZm9yIGdyb3VwcyBvZiBjZWxscyB3aXRoIGhpZ2ggbW9kdWxhcml0eS0tbW9yZSBjb25uZWN0aW9ucyB3aXRoaW4gdGhlIGdyb3VwIHRoYW4gYmV0d2VlbiBncm91cHMuIFRoZSByZXNvbHV0aW9uIHBhcmFtZXRlciBkZXRlcm1pbmVzIHRoZSBzY2FsZS4uLmhpZ2hlciByZXNvbHV0aW9uIHdpbGwgZ2l2ZSBtb3JlIGNsdXN0ZXJzLCBsb3dlciByZXNvbHV0aW9uIHdpbGwgZ2l2ZSBmZXdlci4KCkZvciB0aGUgdG9wLWxldmVsIGNsdXN0ZXJpbmcsIGFpbSB0byB1bmRlci1jbHVzdGVyIGluc3RlYWQgb2Ygb3Zlci1jbHVzdGVyLiBJdCB3aWxsIGJlIGVhc3kgdG8gc3Vic2V0IGdyb3VwcyBhbmQgZnVydGhlciBhbmFseXplIHRoZW0gYmVsb3cuCgpgYGB7cn0KIyBTZXQgcmVzb2x1dGlvbiAKcmVzLnVzZWQgPC0gMC40Cgp0aXNzIDwtIEZpbmRDbHVzdGVycyhvYmplY3QgPSB0aXNzLCByZWR1Y3Rpb24udHlwZSA9ICJwY2EiLCBkaW1zLnVzZSA9IDE6bi5wY3MsIAogICAgcmVzb2x1dGlvbiA9IHJlcy51c2VkLCBwcmludC5vdXRwdXQgPSAwLCBzYXZlLlNOTiA9IFRSVUUsIGZvcmNlLnJlY2FsYyA9IFRSVUUpCmBgYAoKClRvIHZpc3VhbGl6ZSAKYGBge3J9CiMgSWYgY2VsbHMgYXJlIHRvbyBzcHJlYWQgb3V0LCB5b3UgY2FuIHJhaXNlIHRoZSBwZXJwbGV4aXR5LiBJZiB5b3UgaGF2ZSBmZXcgY2VsbHMsIHRyeSBhIGxvd2VyIHBlcnBsZXhpdHkgKGJ1dCBuZXZlciBsZXNzIHRoYW4gMTApLgp0aXNzIDwtIFJ1blRTTkUob2JqZWN0ID0gdGlzcywgZGltcy51c2UgPSAxOm4ucGNzLCBzZWVkLnVzZSA9IDIwLCBwZXJwbGV4aXR5PTM1LCBkaW0uZW1iZWQgPSAyKQpUU05FUGxvdChvYmplY3QgPSB0aXNzLCBkby5sYWJlbCA9IFQsIHB0LnNpemUgPSAxLjIsIGxhYmVsLnNpemUgPSA0KQpgYGAKCgpDaGVjayBleHByZXNzaW9uIG9mIGdlbmVzIG9mIGludGVyc2V0LgoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9MTYsIGZpZy53aWR0aD0xMH0KZ2VuZXNfdG9fY2hlY2sgPSBjKCdUb3AyYScsICdDZGMyMCcsICdNa2k2NycsICdLcnQxNScsICdLcnQ1JywgJ0tydDE0JywgJ1Nic24nLCAnS3J0MTAnLCAnS3J0NCcsICdLcnQxMycsICdLcnQzNicsICdLcnQ4NCcsICdIb3hjMTMnLCAnS3J0OCcsICdUYXMxcjEnLCAnVGFzMXIyJywgJ1RhczFyMycsICdOY2FtMScsICdDYXI0JykKRmVhdHVyZVBsb3QodGlzcywgZ2VuZXNfdG9fY2hlY2ssIHB0LnNpemUgPSAxLCBuQ29sID0gMykKYGBgCgpEb3RwbG90cyBsZXQgeW91IHNlZSB0aGUgaW50ZW5zaXR5IG9mIGV4cHByZXNzaW9uIGFuZCB0aGUgZnJhY3Rpb24gb2YgY2VsbHMgZXhwcmVzc2luZyBmb3IgZWFjaCBvZiB5b3VyIGdlbmVzIG9mIGludGVyZXN0LgoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTIwfQojIFRvIGNoYW5nZSB0aGUgeS1heGlzIHRvIHNob3cgcmF3IGNvdW50cywgYWRkIHVzZS5yYXcgPSBULgpEb3RQbG90KHRpc3MsIGdlbmVzX3RvX2NoZWNrLCBwbG90LmxlZ2VuZCA9IFQpCmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTIwLCBmaWcud2lkdGg9MjB9CiMgVG8gY2hhbmdlIHRoZSB5LWF4aXMgdG8gc2hvdyByYXcgY291bnRzLCBhZGQgdXNlLnJhdyA9IFQuClZsblBsb3QodGlzcywgZ2VuZXNfdG9fY2hlY2ssIHkubG9nID0gVFJVRSkKYGBgCgoKSG93IGJpZyBhcmUgdGhlIGNsdXN0ZXJzPwpgYGB7cn0KdGFibGUodGlzc0BpZGVudCkKYGBgCgpgYGB7cn0KdGlzczE9QnVpbGRDbHVzdGVyVHJlZSh0aXNzKQpgYGAKCmBgYHtyfQojY2x1c3RlcjEubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzLCBpZGVudC4xID0gMSwgbWluLnBjdCA9IDAuMjUsIG9ubHkucG9zID0gVFJVRSwgdGhyZXNoLnVzZSA9IDAuMjUpCiNjbHVzdGVyMi5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHRpc3MsIGlkZW50LjEgPSAyLCBtaW4ucGN0ID0gMC4yNSwgb25seS5wb3MgPSBUUlVFLCB0aHJlc2gudXNlID0gMC4yNSkKI2NsdXN0ZXIzLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gdGlzcywgaWRlbnQuMSA9IDMsIG1pbi5wY3QgPSAwLjI1LCBvbmx5LnBvcyA9IFRSVUUsIHRocmVzaC51c2UgPSAwLjI1KQojY2x1c3RlcjQubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzLCBpZGVudC4xID0gNCwgbWluLnBjdCA9IDAuMjUsIG9ubHkucG9zID0gVFJVRSwgdGhyZXNoLnVzZSA9IDAuMjUpCiNjbHVzdGVyNS5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHRpc3MsIGlkZW50LjEgPSA1LCBtaW4ucGN0ID0gMC4yNSwgb25seS5wb3MgPSBUUlVFLCB0aHJlc2gudXNlID0gMC4yNSkKY2x1c3RlcjYubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzLCBpZGVudC4xID0gNiwgbWluLnBjdCA9IDAuMjUsIG9ubHkucG9zID0gVFJVRSwgdGhyZXNoLnVzZSA9IDAuMjUpCiNjbHVzdGVyNy5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHRpc3MsIGlkZW50LjEgPSA3LCBtaW4ucGN0ID0gMC4yNSwgb25seS5wb3MgPSBUUlVFLCB0aHJlc2gudXNlID0gMC4yNSkKI2NsdXN0ZXI4Lm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gdGlzcywgaWRlbnQuMSA9IDgsIG1pbi5wY3QgPSAwLjI1LCBvbmx5LnBvcyA9IFRSVUUsIHRocmVzaC51c2UgPSAwLjI1KQojY2x1c3RlcjkubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSB0aXNzLCBpZGVudC4xID0gOSwgbWluLnBjdCA9IDAuMjUsIG9ubHkucG9zID0gVFJVRSwgdGhyZXNoLnVzZSA9IDAuMjUpCiNjbHVzdGVyMC5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHRpc3MsIGlkZW50LjEgPSAwLCBtaW4ucGN0ID0gMC4yNSwgb25seS5wb3MgPSBUUlVFLCB0aHJlc2gudXNlID0gMC4yNSkKYGBgCgpXaGljaCBtYXJrZXJzIGlkZW50aWZ5IGEgc3BlY2lmaWMgY2x1c3Rlcj8KYGBge3J9CnByaW50KHggPSBoZWFkKHggPSBjbHVzdGVyNi5tYXJrZXJzLCBuID0gMzApKQpgYGAKCgpZb3UgY2FuIGFsc28gY29tcHV0ZSBhbGwgbWFya2VycyBmb3IgYWxsIGNsdXN0ZXJzIGF0IG9uY2UuIFRoaXMgbWF5IHRha2Ugc29tZSB0aW1lLgpgYGB7cn0KdGlzcy5tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKG9iamVjdCA9IHRpc3MsIG9ubHkucG9zID0gVFJVRSwgbWluLnBjdCA9IDAuMjUsIHRocmVzaC51c2UgPSAwLjI1KQpgYGAKCkRpc3BsYXkgdGhlIHRvcCBtYXJrZXJzIHlvdSBjb21wdXRlZCBhYm92ZS4KYGBge3J9CnRpc3MubWFya2VycyAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKDIwLCBhdmdfbG9nRkMpCmBgYAoKCkdlbmVyYXRlIGFuIGV4cHJlc3Npb24gaGVhdG1hcCBmb3IgZ2l2ZW4gY2VsbHMgYW5kIGdlbmVzLiBJbiB0aGlzIGNhc2UsIHdlIGFyZSBwbG90dGluZyB0aGUgdG9wIDIwIG1hcmtlcnMgKG9yIGFsbCBtYXJrZXJzIGlmIGxlc3MgdGhhbiAyMCkgZm9yIGVhY2ggY2x1c3Rlci4KYGBge3IsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NTAsIGZpZy53aWR0aD0zNX0KI3RvcDEwIDwtIHRpc3MubWFya2VycyAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKDEwLCBhdmdfbG9nRkMpCnRvcDIwIDwtIHRpc3MubWFya2VycyAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKDIwLCBhdmdfbG9nRkMpCiMgc2V0dGluZyBzbGltLmNvbC5sYWJlbCB0byBUUlVFIHdpbGwgcHJpbnQganVzdCB0aGUgY2x1c3RlciBJRFMgaW5zdGVhZCBvZgojIGV2ZXJ5IGNlbGwgbmFtZQpEb0hlYXRtYXAodGlzcywgZ2VuZXMudXNlID0gdG9wMjAkZ2VuZSwgc2xpbS5jb2wubGFiZWwgPSBUUlVFLCByZW1vdmUua2V5ID0gVFJVRSwgY2V4LnJvdyA9IDIwLCBncm91cC5jZXggPSAyMCApCmBgYAoKCgojIyBBc3NpZ25pbmcgY2VsbCB0eXBlIGlkZW50aXR5IHRvIGNsdXN0ZXJzCgpBdCBhIGNvYXJzZSBsZXZlbCwgd2UgY2FuIHVzZSBjYW5vbmljYWwgbWFya2VycyB0byBtYXRjaCB0aGUgdW5iaWFzZWQgY2x1c3RlcmluZyB0byBrbm93biBjZWxsIHR5cGVzOgpDbHVzdGVyIDA6IGJhc2FsIGNlbGwgb2YgZXBpZGVybWlzIChDTDowMDAyMTg3KQpDbHVzdGVyIDE6IGRpZmZlcmVudGlhdGVkIGtlcmF0aW5vY3l0ZXMgKENMOjAwMDAzMTIpCkNsdXN0ZXIgMjogcHJvbGlmZXJhdGluZyBiYXNhbCBjZWxsIG9mIGVwaWRlcm1pcyAoQ0w6MDAwMjE4NykKQ2x1dHNlciAzOiBiYXNhbCBjZWxsIG9mIGVwaWRlcm1pcyAoQ0w6MDAwMjE4NykgCkNsdXN0ZXIgNDogc3VwcmFiYXNhbCBkaWZmZXJlbnRpYXRpbmcga2VyYXRpbm9jeXRlcyAgKENMOjAwMDAzMTIpCkNsdXN0ZXIgNTogYmFzYWwgY2VsbCBvZiBlcGlkZXJtaXMgKENMOjAwMDIxODcpIApDbHVzdGVyIDY6IHN1cHJhYmFzYWwgZGlmZmVyZW50aWF0ZWQga2VyYXRpbm9jeXRlcyAoQ0w6MDAwMDMxMikKQ2x1c3RlciA3OiBiYXNhbCBjZWxsIG9mIGVwaWRlcm1pcyAoQ0w6MDAwMjE4NykKQ2x1dHNlciA4OiBzdXByYWJhc2FsIGRpZmZlcmVudGlhdGVkIGtlcmF0aW5vY3l0ZXMgKENMOjAwMDAzMTIpCkNsdXN0ZXIgOTogZmlsaWZvcm0gZGlmZmVyZW50aWF0ZWQga2VyYXRpbm9jeXRlcyAoQ0w6MDAwMDMxMikKQ2x1c3RlciAxMDogTGFuZ2VyaGFucyBjZWxscyAoQ0w6MDAwMDQ1MykKYGBge3J9CiMgc3Rhc2ggY3VycmVudCBjbHVzdGVyIElEcwp0aXNzIDwtIFN0YXNoSWRlbnQob2JqZWN0ID0gdGlzcywgc2F2ZS5uYW1lID0gImNsdXN0ZXIuaWRzIikKCiMgZW51bWVyYXRlIGN1cnJlbnQgY2x1c3RlciBJRHMgYW5kIHRoZSBsYWJlbHMgZm9yIHRoZW0KY2x1c3Rlci5pZHMgPC0gYygwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCkKCmZyZWVfYW5ub3RhdGlvbiA8LSBjKAogImJhc2FsX2NlbGxzIiwgCiAiZGlmZmVyZW50aWF0ZWQiLCAKICJwcm9saWZlcmF0aW5nIiwgCiAiYmFzYWxfY2VsbHMiLCAKICJzdXByYWJhc2FsX2RpZmZlcmVudGlhdGluZyIsIAogImJhc2FsX2NlbGxzIiwgCiAic3VwcmFiYXNhbF9kaWZmZXJlbnRpYXRlZCIsIAogImJhc2FsX2NlbGxzIiwgCiAic3VwcmFiYXNhbF9kaWZmZXJlbnRpYXRlZCIsIAogImZpbGlmb3JtX2RpZmZlcmVudGlhdGVkIiwgCiAiTGFuZ2VyaGFucyBjZWxscyIKICkKY2VsbF9vbnRvbG9neV9jbGFzcyA8LSBjKAoiYmFzYWwgY2VsbCBvZiBlcGlkZXJtaXMiLCAKImtlcmF0aW5vY3l0ZSIsIAoiYmFzYWwgY2VsbCBvZiBlcGlkZXJtaXMiLAoiYmFzYWwgY2VsbCBvZiBlcGlkZXJtaXMiLAoia2VyYXRpbm9jeXRlIiwKImJhc2FsIGNlbGwgb2YgZXBpZGVybWlzIiwKImtlcmF0aW5vY3l0ZSIsCiJiYXNhbCBjZWxsIG9mIGVwaWRlcm1pcyIsCiJrZXJhdGlub2N5dGUiLAoia2VyYXRpbm9jeXRlIiwKICJMYW5nZXJoYW5zIGNlbGxzIgogKQoKY2VsbF9vbnRvbG9neV9pZCA8LSBjKAoiQ0w6MDAwMjE4NyIsCiJDTDowMDAwMzEyIiwgCiJDTDowMDAyMTg3IiwgCiJDTDowMDAyMTg3IiwgCiJDTDowMDAwMzEyIiwgCiJDTDowMDAyMTg3IiwgCiJDTDowMDAwMzEyIiwgCiJDTDowMDAyMTg3IiwgCiJDTDowMDAwMzEyIiwgCiJDTDowMDAwMzEyIiwgCiJDTDowMDAwNDUzIgopCgp0aXNzQG1ldGEuZGF0YVssJ2ZyZWVfYW5ub3RhdGlvbiddIDwtIHBseXI6Om1hcHZhbHVlcyh4ID0gdGlzc0BpZGVudCwgZnJvbSA9IGNsdXN0ZXIuaWRzLCB0byA9IGZyZWVfYW5ub3RhdGlvbikKdGlzc0BtZXRhLmRhdGFbLCdjZWxsX29udG9sb2d5X2NsYXNzJ10gPC0gcGx5cjo6bWFwdmFsdWVzKHggPSB0aXNzQGlkZW50LCBmcm9tID0gY2x1c3Rlci5pZHMsIHRvID0gY2VsbF9vbnRvbG9neV9jbGFzcykKdGlzc0BtZXRhLmRhdGFbLCdjZWxsX29udG9sb2d5X2lkJ10gPC0gcGx5cjo6bWFwdmFsdWVzKHggPSB0aXNzQGlkZW50LCBmcm9tID0gY2x1c3Rlci5pZHMsIHRvID0gY2VsbF9vbnRvbG9neV9pZCkKCnRpc3NAbWV0YS5kYXRhW3Rpc3NAY2VsbC5uYW1lcywnZnJlZV9hbm5vdGF0aW9uJ10gPC0gYXMuY2hhcmFjdGVyKHRpc3NAbWV0YS5kYXRhJGZyZWVfYW5ub3RhdGlvbikKdGlzc0BtZXRhLmRhdGFbdGlzc0BjZWxsLm5hbWVzLCdjZWxsX29udG9sb2d5X2NsYXNzJ10gPC0gYXMuY2hhcmFjdGVyKHRpc3NAbWV0YS5kYXRhJGNlbGxfb250b2xvZ3lfY2xhc3MpCnRpc3NAbWV0YS5kYXRhW3Rpc3NAY2VsbC5uYW1lcywnY2VsbF9vbnRvbG9neV9pZCddIDwtIGFzLmNoYXJhY3Rlcih0aXNzQG1ldGEuZGF0YSRjZWxsX29udG9sb2d5X2lkKQoKVFNORVBsb3Qob2JqZWN0ID0gdGlzcywgZG8ubGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMC41LCBncm91cC5ieT0nY2VsbF9vbnRvbG9neV9jbGFzcycpCmBgYAoKIyMgU3VwcGxlbWVudGFyeSBGaWd1cmVzIAoKRmlnLiBzdXBwVG9uZ3VlMS4gdFNORSBiYXNlZCBvbiBmcmVlIGFubm90YXRpb24KCkZpZy4gc3VwcFRvbmd1ZTIuIEV4cHJlc3Npb24gb2YgZ2VuZXMgdXNlZCBmb3IgYW5ub3RhdGlvbiBvZiB0aGUgY2x1c3RlcnMuIEZlYXR1cmUgcGxvdCBmcm9tIGJvdGggcGxhdGZvcm1zIG9uOiBUb3AyYSwgQ2RjMjAsIE1raTY3LCBLcnQxNSwgS3J0NSwgS3J0MTQsIFNic24sIEtydDEwLCBLcnQ0LCBLcnQxMywgS3J0MzYsIEtydDg0LCBIb3hjMTMKCkZpZy4gc3VwcFRvbmd1ZTMuICBFeHByZXNzaW9uIG9mIGdlbmVzIGtub3duIHRvIGJlIGV4cHJlc3NlZCBpbiB0YXN0ZSByZWNlcHRvciBjZWxscy4gIFZpb2xpbiBwbG90IGZyb20gYm90aCBwbGF0Zm9ybXMgb246IEtydDgsIFRhczFyMSwgVGFzMXIyLCBUYXMxcjMsIE5jYW0xLCBDYXI0CgoKCiMjIENoZWNraW5nIGZvciBiYXRjaCBlZmZlY3RzCgpDb2xvciBieSBtZXRhZGF0YSwgbGlrZSBwbGF0ZSBiYXJjb2RlLCB0byBjaGVjayBmb3IgYmF0Y2ggZWZmZWN0cy4KYGBge3J9ClRTTkVQbG90KG9iamVjdCA9IHRpc3MsIGRvLnJldHVybiA9IFRSVUUsIGdyb3VwLmJ5ID0gImNoYW5uZWwiKQpgYGAKCmBgYHtyfQpUU05FUGxvdChvYmplY3QgPSB0aXNzLCBkby5yZXR1cm4gPSBUUlVFLCBncm91cC5ieSA9ICJtb3VzZS5zZXgiKQpgYGAKClByaW50IGEgdGFibGUgc2hvd2luZyB0aGUgY291bnQgb2YgY2VsbHMgaW4gZWFjaCBpZGVudGl0eSBjYXRlZ29yeSBmcm9tIGVhY2ggcGxhdGUuCgpgYGB7cn0KdGFibGUoYXMuY2hhcmFjdGVyKHRpc3NAaWRlbnQpLCBhcy5jaGFyYWN0ZXIodGlzc0BtZXRhLmRhdGEkY2hhbm5lbCkpCmBgYAoKIyBTYXZlIHRoZSBSb2JqZWN0IGZvciBsYXRlcgpXaGVuIHlvdSBzYXZlIHRoZSBhbm5vdGF0ZWQgdGlzc3VlLCBwbGVhc2UgZ2l2ZSBpdCBhIG5hbWUuCgpgYGB7cn0KZmlsZW5hbWUgPSBoZXJlKCcwMF9kYXRhX2luZ2VzdCcsICcwNF90aXNzdWVfcm9ial9nZW5lcmF0ZWQnLCAKCQkgIHBhc3RlMCgiZHJvcGxldCIsIHRpc3N1ZV9vZl9pbnRlcmVzdCwgIl9zZXVyYXRfdGlzcy5Sb2JqIikpCnByaW50KGZpbGVuYW1lKQpzYXZlKHRpc3MsIGZpbGU9ZmlsZW5hbWUpCmBgYAoKYGBge3J9CiMgVG8gcmVsb2FkIGEgc2F2ZWQgb2JqZWN0CmZpbGVuYW1lID0gaGVyZSgnMDBfZGF0YV9pbmdlc3QnLCAnMDRfdGlzc3VlX3JvYmpfZ2VuZXJhdGVkJywgCiAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoImRyb3BsZXQiLCB0aXNzdWVfb2ZfaW50ZXJlc3QsICJfc2V1cmF0X3Rpc3MuUm9iaiIpKQogbG9hZChmaWxlPWZpbGVuYW1lKQpgYGAKCgojIEV4cG9ydCB0aGUgZmluYWwgbWV0YWRhdGEKClNvIHRoYXQgQmlvaHViIGNhbiBlYXNpbHkgY29tYmluZSBhbGwgeW91ciBjZWxsX29udG9sb2d5X2NsYXNzcywgcGxlYXNlIGV4cG9ydCB0aGVtIGFzIGEgc2ltcGxlIGNzdi4KCmBgYHtyfQpoZWFkKHRpc3NAbWV0YS5kYXRhKQpgYGAKCgpgYGB7cn0KZmlsZW5hbWUgPSBoZXJlKCcwMF9kYXRhX2luZ2VzdCcsICcwM190aXNzdWVfYW5ub3RhdGlvbl9jc3YnLCAKCQkgIHBhc3RlMCh0aXNzdWVfb2ZfaW50ZXJlc3QsICJfZHJvcGxldF9jZWxsX29udG9sb2d5X2NsYXNzLmNzdiIpKQp3cml0ZS5jc3YoRmV0Y2hEYXRhKHRpc3MsIGMoJ2NoYW5uZWwnLCdjZWxsX29udG9sb2d5X2NsYXNzJywnY2VsbF9vbnRvbG9neV9pZCcsICdmcmVlX2Fubm90YXRpb24nLCAndFNORV8xJywgJ3RTTkVfMicpKSwgZmlsZT1maWxlbmFtZSkKYGBgCg==